use crate::hot100::base::{ListNode, Vec2ListNode};

#[test]
fn test_reverse_list() {
    let node = ListNode::new(-1);
    assert_eq!(
        reverse_list(node.from_vec(vec![1, 2, 3, 4, 5])),
        node.from_vec(vec![5, 4, 3, 2, 1])
    );

    assert_eq!(
        reverse_list(node.from_vec(vec![1, 2])),
        node.from_vec(vec![2, 1])
    );

    assert_eq!(reverse_list(node.from_vec(vec![])), node.from_vec(vec![]));

    assert_eq!(reverse_list(node.from_vec(vec![1])), node.from_vec(vec![1]));
}

/*
    206. 反转链表
    给你单链表的头节点 head ，请你反转链表，并返回反转后的链表。
    示例 1：
    输入：head = [1,2,3,4,5]
    输出：[5,4,3,2,1]

    示例 2：
    输入：head = [1,2]
    输出：[2,1]

    示例 3：
    输入：head = []
    输出：[]

    提示：
    链表中节点的数目范围是 [0, 5000]
    -5000 <= Node.val <= 5000

    进阶：链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题？
*/
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    if head.is_none() {
        return None;
    }

    let mut pre = head.unwrap();
    let mut current = pre.next.take();
    while let Some(mut node) = current {
        current = node.next.replace(pre);
        pre = node;
    }
    return Some(pre);
}
